package com.lenovo.lcdm.type.service;

import com.lenovo.lcdm.type.vo.*;

import java.util.List;
import java.util.Map;

/**
 * @Auther xujing30
 * @Date 2024/01/17
 * @Description
 */
public interface TypeAttributeExtService {

    /**
     * 获取该对象下所有的分组属性信息
     * @return
     */
    Map<String, List<AttributeDetailView>> getAttributeValuesWithGroup(Typed typed);

    List<AttributeDetailView> getAttributeValues(Typed typed);

    LocalAttributeModel getLocalAttributeModel(Long typeId, Long globalAttributeId);

    void saveAttributeValues(Typed typed, Map<Long, Object> valuesMap);

    void saveAttributeValues(Typed typed, Map<Long, Object> valuesMap, boolean needValidate);

    LocalAttributeModel getLocalAttribute(Long typeId, String attributeName);

    void deleteAttributeValue(Typed typed, List<Long> values);

    void saveAttributeValue(Typed typed, Long globalAttributeId, Object value);

    String getAttributeTableFromTypeId(Long typeId);

    /**
     * 根据type internal name获取Type及该Type下所有的Sub Type信息，但该API不提供该Type下的Local Attribute的信息
     * @param typeInternalName type internal name
     * @return Type及该Type下所有的Sub Type的树状结构信息
     */
    TypeDefinitionTreeModel getTypeMultipleLevelTree(String typeInternalName);

    /**
     * 根据type id查询type的简要信息，包括type的所有层级的sub type，但不包括type的local attribute，以及Local
     * attribute的constraint 和 default value
     *
     * @param typeId : type definition id
     * @return Type definition 对象
     */
    TypeDefinitionTreeModel getTypeMultipleLevelTree(long typeId);

    /**
     * 根据type id 获取类型的详细信息，包括类型的属性，local attribute属性，但该API不返回type的 sub type的信息
     * Params:typeId – type ID
     * Returns:Type definition model， 类型的详细信息，包括类型的属性，local attribute属性
    */
    TypeDefinitionModel getTypeDetail(Long typeId);

    /**
     *
     * @param typeInternalName
     * @return
     */
    TypeDefinitionModel getTypeDetail(String typeInternalName);

    List<LocalAttributeModel> getLocalAttributeModels(Long typeId);

    AttributeDetailView getAttributeValue(Typed typed, String attributeName);
}
